| <<<предыдущая глава | к содержанию | следующая глава >>> |
Никакой анализ статистических данных не может обойтись без предварительной их обработки:
max (A) , min(A) - поиск экстремальных элементов по столбцам массива А;
max(A,B) , min(A,B) - формирование массива с элементами, равными экстремальным из соответствующих элементов массивов;
max(A,[ ],dim) , min(A,[ ],dim) - вектор экстремальных элементов по измерению dim;
[C,I]=max(...) , [C,I]=min(...) - дополнительно выводится строка индексов экстремальных элементов;
median(X) , median (X,dim) - медианы массива;
mean(X) , mean (X,dim) -средние значения;
std(X) , std(X,flag) , std(X,flag,dim) - стандартное отклонение (flag=0 -несмещенная оценка s ; flag=1 - смещенная оценка s):
;
;
cov(X, Y) , cov(X,Y, flag) - ковариация для для массивов Х и Y (каждый столбец - переменная, строка - наблюдение)
, f=n или n-1;
cov(X) , cov(X,flag) - ковариация для столбцов массива Х ;
corrcoef (X) , corrcoef (X,Y) -коэффициенты корреляции:
.
Как известно, численное дифференцирование строится на использовании аппарата конечных разностей и соответствующего многообразия аппроксимаций. Здесь полезны функции:
diff(X), diff(X, n), diff(X, n, dim) - вычисление конечных разностей (первых, n-го порядка или по указанному измерению); если Х -массив, берутся разности между столбцами:
| >> F= | [ 0 | 0.0998 | 0.1987 | 0.2955 | 0.3894 | 0.4794] |
| >> D=diff(F) | ||||||
| D = | 0.0998 | 0.0988 | 0.0969 | 0.0939 | 0.0900 | |
| >> D2=diff(F,2) | ||||||
| D2 = | -0.0010 | -0.0020 | -0.0030 | -0.0039 | ||
Для задач оптимизации градиентными методами полезны функции:
gradient(F), gradient(F,h), gradient(F,h1,h2,...) -приближенная оценка градиента функции n переменных с автоматическим выбором шага или с указанным шагом (одинаковым или разным по переменным):
| >> [x,y]=meshgrid(-2:0.2:2, -2:0.2:2); | % выбор сетки узлов |
| >> z=x.*exp(-x.^2-y.^2); | % вычисление значений на сетке |
| >> [px,py]=gradient(z,.2,.2); | % поиск градиента в узлах сетки |
| >> contour(z), hold on,quiver(px,py), hold off % рис.8.1 | |
![]() Рис.8.1. | ![]() Рис.8.2. |
polifit(X,Y,n) - аппроксимация функции Y=Y(X) полиномом n-й степени:
| >> X=0:0.1:0.5; | |
| >> F=X.*sin(X); | |
| >> P=polyfit(X,F,1) | |
| P = 0.4814 -0.0314 | % P(x)= 0.4814 x -0.0314 |
| >> FF=polyval(P,X) | |
| FF = -0.0314 0.0168 0.0649 0.1130 0.1612 0.2093 | |
| >> plot(X,F,'ob', X,FF,'-g'),grid,axis([0 0.5 -0.05 0.25]) % рис.8.2 | |
interpft(Y,n,dim) -аппроксимация периодической функции на основе быстрого преобразования Фурье (Y - одномерный массив значений функции;
![]() Рис.8.3. | n - число узлов в массиве значений):
>> X=0:10; >> Y=sin(X).^2.*exp(-0.1.*X); >> YP=interpft(Y,21); >> xp=0:0.5:10; >> plot(X,Y,'ob', xp,YP) % Рис. 8.3 Заметим, что в библиотеке имеется богатый ассортимент средств для преобразования Фурье. |
spline(X,Y,Z) - интерполяция Y=Y(X) кубическим сплайном и вывод соответствующих значений в точках Z. Для получения большей информации используется конструкция pp=spline(X,Y): здесь командой V=ppval(pp,Z) можно найти значения в точках Z, a командой [Xs, Coef, m,L]=unmkpp(pp) получить данные о векторе разбиений аргумента Xs, коэффициентах Coef, m=length(Xs), L=length(Coef)/m .
interp1(X,Y,Z), interp1(X,Y,Z,'method') - одномерная табличная интерполяция (если Y двумерный массив, интерполяция ведется по каждому столбцу; значения Z должны входить в диапазон значений Х). Можно указать метод интерполяции - кусочно-линейной (linear, по умолчанию), ступенчатой (nearest), кубической (cubic), кубическими сплайнами (spline). Функция interp1q(X,Y,Z) реализует быструю линейную интерполяцию на неравномерной сетке.
interp2(X1,X2,Y,Z1,Z2), interp1(X1,X2,Y,Z1,Z2,'method') - двумерная табличная интерполяция Y=Y(X1,X2), аргументы должны меняться монотонно и заданы в формате функции meshgrid.
interp3(X1,X2,X3,Y,Z1,Z2,Z3), interp3(..., 'method') - трехмерная табличная интерполяция Y=Y(X1,X2,X3);
interpn(X1,X2,...,Y,Z1,Z2,...), interp3(..., 'method') - многомер-ная табличная интерполяция Y=Y(X1,X2,...);
griddata(X1,X2,Y,Z1,Z2), griddata(X1,X2,Y,Z1,Z2, 'method') - двумерная табличная интерполяция на неравномерной сетке.
polyarea (X,Y), polyarea (X,Y, dim) -площадь многоугольника с координатами вершин (X,Y):
>> polyarea ([1 2 3 4 5],[0 3 6 3 0])
ans = 12
trapz(X,Y), trapz(X,Y, dim) - вычисление интеграла по формуле трапеций ; функции cumtrapz(X,Y), cumtrapz(X,Y, dim) вычисляют к тому же промежуточные результаты;
quad('имя', a,b), quad('имя', a,b, eps), quad('имя', a,b, eps, trace), quad('имя', a,b, eps, trace,P1,P2,...), quad8(...) - вычисление определенного интеграла: a,b - пределы интегрирования; eps - относительная погрешность (по умолчанию 10-3); trace -построение точечного графика функции; 'имя' - имя подинтегральной функции (встроенной или М-файла); P1,P2,... - передаваемые параметры функции; quad использует квадратуру Симпсона, quad8 - Ньютона-Котеса 8-го порядка). Используется рекурсия до глубины 10 и может появиться сообщение - подозрение о сингулярности функции (наличии особенностей).
function f=integr(x) f=x.*exp(-x);>>quad('integr',0,2, 1e-5,1) ans = 0.5940 dblquad('имя', a1,b1, a2,b2), dblquad('имя', a1,b1, a2,b2, eps), dblquad('имя', a1,b1, a2,b2, eps, <метод>) - вычисление двойного интеграла от функции <имя>(Х1,X2) ; <метод> - quad или quad8. | ![]() Рис.8.5. |
Как известно, решение уравнений и поиск экстремумов функций - родственные задачи. Так решение системы fi(X)=0, i=1,...,n можно заменить поиском минимума
, заведомо равного нулю, если система имеет решение. С другой стороны, поиск экстремумов функции можно свести к решению системы уравнений относительно нулевых значений ее производных.
Для некоторых классов функций имеются вполне универсаль-ные методы решения: так для полиномов поиск корней реализуется без каких-то условий обобщенным методом Ньютона - функцией roots(...) . В общем случае при великом многообразии методов реше-ние подобных задач отнюдь нетроивиально. В системе реализованы функции лишь для простейших задач без гарантий получения реше-ния.
xmin=fmin('имя',a,b), xmin=fmin('имя',a,b,<опции>), xmin= fmin ('имя', a,b,<опции>, p1,...,p10), [xmin,options]=fmin(...) - поиск минимума функции одной переменной на интервале [a,b]; в списке <опции> можно указать option(1)=1 (вывод промежуточных результатов), option(2)- погрешность итераций для аргумента (разница между смежными приближениями; по умолчанию 10-4) и option(14)- максимальное число итераций (по умолчанию 500). Используется метод золотого сечения и параболической интерполяции.
| function r=m1(x) | |||
| r=x^2-x-3; | |||
| >> xm=fmin('m1',-2,3,[1, 1e-6]) | |||
| Func | evals x | f(x) | Procedure |
| 1 | -0.0901699 | -2.9017 | initial |
| 2 | 1.09017 | -2.9017 | golden |
| 3 | 1.81966 | -1.5085 | golden |
| 4 | 0.5 | -3.25 | parabolic |
| 5 | 0.5 | -3.25 | parabolic |
| 6 | 0.5 | -3.25 | parabolic |
| xm = | |||
| 0.5000 | |||
xmin=fmins('имя',x0), xmin=fmins('имя',x0,<опции>), xmin= fmins ('имя', x0,<опции> или [], p1,...,p10), [xmin,options]=fmins(...) - поиск минимума функции нескольких переменных: x0 - начальное приближение; p1,...,p10 - дополнительные параметры; в списке <опции> можно указать option(1)=1 (вывод промежуточных результа-тов), option(2)- погрешность итераций для аргумента (разница между смежными приближениями; по умолчанию 10-4), option(3)-итерационная погрешность для функции и option(14)- максимальное число итераций (по умолчанию 200 x n).
| function r=m2(x) | |||||||||
| r=(x(1)-1)^2+(x(2)-3)^2; | |||||||||
| >> | [xmin,opt]=fmins('m2',[0.5 2.5])|||||||||
| xmin = | |||||||||
| 1.0000 | 3.0000 | ||||||||
| opt = | |||||||||
| 0 | 0.0001 | 0.0001 | 0.0000 | 0 | 0 | 0 | 0.0000 | 0 | |
| 72 | 0 | 0 | 0 | 400 | 0 | 0.0000 | 0.1000 | 0 | |
(возвращаемые здесь опции 8 и 10 определяют минимум функции и число итераций). Используется метод Нелдера-Мида (строится симплекс из n+1 вершины в n-мерном пространстве, берется новая точка внутри или вблизи симплекса и может заменить одну из вершин; процесс повторяется до малого диаметра симплекса).
fzero('имя',x0), fzero('имя',x0,eps), fzero ('имя', x0, eps , trace), fzero ('имя', x0, eps, trace,p1,...,p10) - поиск действительных корней функции одной переменной при начальном приближении х0 (можно взять и в форме [a,b] при условии f(a) x f(b) < 0) с заданной относительной погрешностью; trace=1 - вывод промежуточных результатов. Используется метод дихотомии, хорд и обратной квадратической интерполяции. При поиске корней полинома см.roots.
Процесс поиска корня виден из примера:
| >>> fzero('sin',6,[],1) | |||
| Func evals | x | f(x) | Procedure |
| 1 | 6 | -0.279415 | initial |
| 2 | 5.83029 | -0.437567 | search |
| 3 | 6.16971 | -0.113236 | search |
| 4 | 5.76 | -0.499642 | search |
| 5 | 6.24 | -0.0431719 | search |
| 6 | 5.66059 | -0.583146 | search |
| 7 | 6.33941 | 0.0561963 | search |
| Looking for a zero in the interval [5.6606, 6.3394] | |||
| 8 | 6.27974 | -0.00344052 | interpolation |
| 9 | 6.28319 | 1.70244e-006 | interpolation |
| 10 | 6.28319 | -3.35667e-012 | interpolation |
| 11 | 6.28319 | -2.44921e-016 | interpolation |
| 12 | 6.28319 | 2.41961e-015 | interpolation |
| ans = 6.28318530717959 | |||
| >> 2*pi | |||
| ans = 6.28318530717959 | |||
Заметим, что в случае двух переменных существенную помощь для выбора начального приближения может оказать функция gradient (cм. 8.2) и contour(...), которая будет рассмотрена при ознакомлении с функциями графики.
В системе MatLab предусмотрены специальные средства решения задачи Коши для системобыкновенных дифференциальных уравнений, заданных как в явной форме
= F(t,x) , так и в неявной M
=F(t,x), где М- матрица, - т.н. решатель ОДУ (solver ODE), обеспечивающий пользователю возможность выбора метода, задания начальных условий и др.
В простейшем варианте достаточно воспользоваться командой [T,X]=solver('F', [DT], X0, ...), где DT - диапазон интегрирования, X0 - вектор начальных значений, F - имя функции вычисления правых частей системы, solver - имя используемой функции (ode45 - метод Рунге-Кутта 4 и 5-го порядков, ode23 - тот же метод 2 и 3-го поряд-ков, ode113 - метод Адамса - для нежестких систем, ode23s, ode15s - для жестких систем и др.). Версии решателя различаются используемыми методами (по умолчанию относительная погрешность 10-3 и абсолютная 10-6) и соответственно временем и успешностью решения. Под жесткостью здесь понимается повышенное требование к точности - использование минимального шага во всей области интегрирования. При отсутствии информации о жесткости рекомендуется попытаться получить решение посредством ode45 и затем ode15s. Если диапазон DT задан начальным и конечным значением [to , tk], то количество элементов в массиве Т (и в массиве решений Х) определяется необходимым для обеспечения точности шагом; при задании DT в виде [to , t1, t2, ... , tk] или [to :Dt: tk] - указанными значениями.
Например, в простейшем варианте решение уравнения
=tЧe-t в интервале t О[0, 0.5] с начальным условием x(t=0)=1 :
| function f =odu1(t,x) | ||||||||
| f=t*exp(-t); | ||||||||
| >> [T,X]=ode45 ('odu1', [0, 0.5], 1) | ||||||||
| T = | 0 | 0.0125 | 0.0250 | 0.0375 | 0.0500 | 0.0625 | 0.0750 | 0.0875 |
| 0.1000 | 0.1125 | 0.1250 | 0.1375 | 0.1500 | 0.1625 | 0.1750 | … | |
| X = | 1.0000 | 1.0000 | 1.0003 | 1.0006 | 1.0012 | 1.0018 | 1.0027 | 1.0036 |
| 1.0046 | 1.0058 | 1.0072 | 1.0086 | 1.0102 | 1.0118 | 1.0136 | …. | |
Для иллюстрации решения системы и ряда нестандартных возможностей рассмотрим задачу выравнивания цен по уровню актива в следующей постановке.
Предположим, что изменение уровня актива у пропорционально разности между предложением s и спросом р, т.е. y'=k(s-d), k>0, и что изменение цены z пропорционально отклонению актива у от некоторого уровня y0, т.е. z'=-m(y-y0), m>0. Естественно, что предложение и спрос зависят от цены, например, s(z)=az+s0, d(z)= d0 - cz. Соответственно возникает система дифференциальных уравнений
Вычисление правых частей оформляем функцией:
function f=odu2(t,X) y=X(1); z=X(2); a=20; c=10; s0=10; d0=50; k=0.3; m=0.1; s=a*z+s0; d= d0-c*z; y0=19; f(1)=k*(s-d) ; f(2)=-m*(y-y0); f=f'; % вектор-столбец
Если выполнить решение при y0= 19, z0=2
>> [T,Y]=ode45('odu2', [0:0.3:9],[19 2]);
>> [T Y]
>> plot(T,Y)
будет выведена таблица значений искомых функций:
ans = 0 19.0000 2.0000
0.3000 20.7757 1.9731
0.6000 22.4101 1.8949
0.9000 23.7686 1.7714
1.2000 24.7427 1.6126
1.5000 25.2569 1.4313 ...
и их графики (рис. 8.6).
Эта система уравнений относится к числу т.н. автономных (или динамических), ибо независимая переменная в нее явно не входит; соответственно может быть установлена связь между найденными решениями: в параметрическом задании линия y=y(t), z=z(t) определяет фазовую кривую (траекторию) системы - гладкую кривую без самопересечений, замкнутую кривую или точку, которая позволяет судить об устойчивости системы.
Так, установив опции к построению двумерного фазового портрета (функция odephas2)и номера переменных состояния :
>> opt=odeset('OutputSel',[1 2], 'OutputFcn','odephas2');
>> [T,Y]=ode45('odu2', [0:0.3:9],[19 2],opt);
получаем фазовый портрет системы, свидетельствующий о ее устойчивости - гармонии между активом и ценами (рис.8.7).
![]() Рис.8.6 | ![]() Рис.8.7 |
В качестве другого примера подобных задач рассмотрим известную задачу динамики популяций, где рассматривается модель взаимодействия "жертв" и "хищников", в которой учитывается уменьшение численности представителей одной стороны с ростом численности другой. Модель была создана для биологических систем, но с определенными корректурами применима к конкуренции фирм, строительству финансовых пирамид, росту народонаселения, экологической проблематике и др.
Эта модель Вольтерра-Лотка с логистической поправкой описывается системой уравнений
с условиями заданной численности "жертв" и "хищников" в начальный момент t=0.
Решая эту задачу при различных значениях a, получаем различные фазовые портреты (обычный колебательный процесс и постепенная гибель популяций) .
function f=VolterraLog(t,x) a=4; b=2.5; c=2; d=1; alpha=0.1; f(1)= (a-b*x(2))*x(1)-alpha*x(1)^2; f(2)= (-c+d*x(1))*x(2)-alpha*x(2)^2; f=f';>>opt=odeset('OutputSel',[1 2], 'OutputFcn', 'odephas2');
![]() Рис.8.8 (a =0) | ![]() Рис.8.9 (a =0.1) |
Имеется возможность построения и трехмерного фазового портрета с помощью функции odephas3. Например, решение задачи Эйлера свободного движения твердого тела:
=x2x3,
=-x1x3,
=-0.51Чx1x2
выступает в виде:
function f=Eiler(t,x) f(1)= x(2)*x(3); f(2)= -x(1)*x(3) ; f(3)= -0.51*x(1)*x(2) ; f=f';
| >> opt=odeset('OutputSel',[1 2 3], 'OutputFcn', 'odephas3');
>> [T,X]=ode45('Eiler', [0 7.25], [0 0 1], opt ); %рис.8.10 >> [T,X]=ode45('Eiler', [0:0.25:7.25],[0 1 1]); | |
| >> plot(T,X) | % рис.8.11 |
Рис.8.10. | ![]() Рис.8.11. |
| <<<предыдущая глава | к содержанию | следующая глава >>> |